package com.shike.core.utils;

import com.alibaba.fastjson.JSON;
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.shike.core.dto.JwtUserDto;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class JWTUtil {

    private static final Logger logger = LoggerFactory.getLogger(JWTUtil.class);

    private static final String USER_INFO_KEY = "USER_INFO_KEY";

//    /**
//     * 校验 token是否正确
//     *
//     * @param token  密钥
//     * @param secret 用户的密码
//     * @return 是否正确
//     */
//    public static boolean verify(String token, String username, String secret) {
//        try {
//            Algorithm algorithm = Algorithm.HMAC256(secret);
//            JWTVerifier verifier = JWT.require(algorithm)
//                    .withClaim("username", username)
//                    .build();
//            verifier.verify(token);
//            log.info("token is valid");
//            return true;
//        } catch (Exception e) {
//            log.info("token is invalid{}", e.getMessage());
//            return false;
//        }
//    }



    /**
     * 从 token中获取用户名
     *
     * @return token中包含的用户名
     */
    public static JwtUserDto getJwtUser(String token) {
        try {
            DecodedJWT jwt = JWT.decode(token);
            String resultStr = jwt.getClaim(USER_INFO_KEY).as(String.class);
            return JSON.parseObject(resultStr, JwtUserDto.class);
        } catch (JWTDecodeException e) {
            logger.error("error：{}", e.getMessage());
            return null;
        }
    }

    /**
     * 生成 token
     *
     * @param dto 用户信息
     * @return token
     */
    public static String sign(JwtUserDto dto) {
        try {
            // 此处使用redis进行管理有效期
            Algorithm algorithm = Algorithm.HMAC256("shike");
            return JWT.create()
                    .withClaim(USER_INFO_KEY, JSON.toJSONString(dto))
                    .sign(algorithm);
        } catch (Exception e) {
            logger.error("error：{}", e);
            return null;
        }
    }
}
